# 定义列表 列表用方括号 []
数据容器_名字 = ['周杰伦', '张家辉', '红河谷', 44.34]
数据容器_数字 = [22.4, 44, 44.7, False, True]
print(数据容器_名字, 数据容器_数字)
print(type(数据容器_名字), type(数据容器_数字), '\n')
list_列表嵌套 = [['倒数第四给元素'], [22, 'c4', 66.64], ['搜索', True], 数据容器_名字]
print(list_列表嵌套, type(list_列表嵌套), '\n')

for x in list_列表嵌套:
    print(x, type(x))
    for a in x:
        print(a, type(a))
print()

# 列表的下标索引    特别注意 列表位置是从0开始标记的，第一个元素 引索标记是 0 号，第二个元素 引索标记是 1 号，以此类推
list_列表1 = ['第一个元素', '第二个元素', '第三个元素', '第四个元素', '第五个元素', ]
print(list_列表1[2])  # 从0开始计数，可以取列表里单个元素
print(list_列表嵌套[-4])  # 也可以倒着索引从-1开始
print(list_列表嵌套[-1][2])  # 取嵌套列表里的单元素
print()


# 列表的各种操作方法
列表 = ['我1', '要2', '操3', '你4', '吧5', '人6', ]

# 1.查询 元素 具体在列表里的什么索引位置
索引值 = 列表.index('操3')
print(f'操3 这个元素在列表的引索位置是 {索引值}')  # 注意是引索

# 2.修改列表里单独一个元素的值，  可以正向 也可以 反向引索赋值
列表[1] = 'cha2'   # 修改列表里第2给位置的元素
列表[-2] = 'HHH5'  # 修改列表里倒数第2给位置的元素
print(f'列表修改后的： {列表}')

# 3.插入元素  指定一个引索位置，插入一个指定元素
列表.insert(2, '第三插入3')  # 把元素插入列表第3个位置
print(f'插入元素后： {列表}')

# 4.追加元素 把元素追加到列表尾部
列表.append('追加的元素7')
print(f'追加元素后： {列表}')

# 5.追加一批元素 到列表尾部
列表.extend(['追加1', '追加2', '追加3', '追加4'])  # 这里追加一批相当于，追加一个列表所以记得加 方括号
print(f'追加一批元素后： {列表}')

# 删除列表里的元素的2个语法
列表 = ['我1', '要2', '操3', '你4', '吧5', '人6', ]

# 6.删除列表指定索引位置的元素  注意 引索都可以正向0开始 或者 反向 -1开始
del 列表[2]  # 删除列表 第3位置的元素
print(f'删除元素后： {列表}')

# 7.取出列表指定位置的元素，放到别的变量里。 相当于 剪切
列表 = ['我1', '要2', '操3', '你4', '吧5', '人6', ]
提取 = 列表.pop(3)   # 提取列表位置第4的元素
print(f'提取元素后：{列表}，提取出来的元素:  {提取}')

# 8.搜索一个元素，删除它   从前到后第一个匹配的项
列表 = [1, 2, 3, 4, 5, 3, 6]
列表.remove(3)  # 搜索列表里 3 这个值
print(f'搜索，删除元素后： {列表}')  # 只删除了第一个 3 值，后面的 3 值没有删除

# 9.清空这个列表
列表.clear()
print(f'清空列表元素后： {列表}')


# 10.统计列表里某一个元素的数量
列表 = [1, 2, 3, 4, 5, 3, 6]
a = 列表.count(3)  # 3 这个值，在列表里有几个数量
print(a)
print(f'这个值在列表的数量是：', 列表.count(3))

# 11.统计列表一共多少个元素
列表 = [1, 2, 3, 4, 5, 3, 6]
a = len(列表)  # 3 这个值，在列表里有几个数量
print(a)
print(f'列表元素数量是：', len(列表))
print()

"""
列表 排序函数 (按照依据排序)
列表.sort( key=选择排序依据的函数, reverse=True | False)
参数 key 是要求传入一个函数,表示将列表的每一个元素传入函数中,返回排序的依据
参数 reverse是否反转排序结果 True降序  False升序(默认)

具体见 一阶段_第十二章_柱状图 里 一阶段_第十二章_动态时间线柱状图构建.py
"""
列表 = [244, 5, 55, 79, 8]
列表.sort()  # 排序默认升序
print(列表)
列表.sort(reverse=True)  # 降序排序
print(列表)

# 还有一种特殊的排序方式,列表里嵌套列表的情况下怎么排序
列表 = [['a', 244], ['c', 5], ['b', 55], ['d', 79], ['e', 8]]

# 定义一个函数作为排序依据


def 排序依据(下标):
    return 下标[1]  # 列表第2个元素作为排序依据 就是嵌套列表里的第2个元素


# 以嵌套列表里的第2个元素,作为排序依据
列表.sort(key=排序依据)  # 排序默认升序   降序可以填入第2个参数 reverse=True
print(列表)


# 课后小练习
print('\n课后小练习')
学生年龄 = [21, 25, 21, 23, 22, 20, 31]

print('1.', 学生年龄)
学生年龄.extend([29, 33, 30])
print('2.', 学生年龄)
a = 学生年龄.pop(0)
print('3.取出', a)
print('3.', 学生年龄)
a = 学生年龄.pop(-1)
print('4.取出', a)
a = 学生年龄.index(31)
print('5.', a)
print()

# 利用循环遍历 列表元素  2种循环方法
列表1 = ['第一个元素', '第二个元素', '第三个元素', '第四个元素', '第五个元素', ]


def 列表_while循环_遍历(形参列表):
    引索值 = 0
    while 引索值 < len(形参列表):  # len 是查看列表有多少个元素
        print(f'元素列表引索{引索值}的元素是：', 形参列表[引索值])
        引索值 += 1
    print()


def 列表_for循环_遍历(形参列表):
    引索值 = 0
    for 临时变量 in 形参列表:
        print(f'元素列表引索{引索值}的元素是：{临时变量}')
        引索值 += 1
    print()


列表_while循环_遍历(列表1)
列表_for循环_遍历(列表1)

print("小练习")
# 小练习
练习列表 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# 索引值 = 0
偶数列表 = []
while 索引值 < len(练习列表):
    元素 = 练习列表[索引值]
    索引值 += 1
    if 元素 % 2 == 0:  # 如果要奇数就是 元素%2 != 0
        偶数列表.append(元素)
print(f'新的while偶数列表是：{偶数列表}')

偶数列表.clear()  # 清空列表
for 元素 in 练习列表:
    if 元素 % 2 == 0:  # 如果要奇数就是 元素%2 != 0
        偶数列表.append(元素)
print(f'新的for偶数列表是：{偶数列表}')
print()

# 关于列表嵌套 索引号 的问题， 列表嵌套里，被嵌套的列表算一个元素数
list_列表嵌套 = [['倒数第四给元素', 3], [22, 'c4', 66.64], ['搜索', True], 数据容器_名字, 88]
数量 = len(list_列表嵌套)
print(f'这个列表嵌套算 {数量} 个元素数')

索引号 = list_列表嵌套.index(['搜索', True])
print(f'上面括号里要搜索的 在列表嵌套里索引号是{索引号}')


print()
# 复制列表问题
列表 = [1, 2, 3, 4, 5, 6, 7, 8, 9]
副本 = 列表  # 这种赋值,相当于2个列表互相关联,等同于一个列表
列表.append(9)
print(副本, '多了一个 9')   # 看上面对列表的操作,副本一样生效
"""
如果是要复制列表里的值,到另外一个列表里. 要用切片的操作,不能像上面一样关联
副本 = 列表[::]    这样就是复制全部元素到另一个列表,而不会关联了
"""